Error Checking Techniques Socket Programming এবং নেটওয়ার্ক প্রোগ্রামিংয়ে সঠিকভাবে ত্রুটি শনাক্ত এবং হ্যান্ডেল করতে ব্যবহৃত হয়। ত্রুটি সঠিকভাবে চেক এবং হ্যান্ডেল না করা হলে অ্যাপ্লিকেশন ক্র্যাশ হতে পারে বা অপ্রত্যাশিত আচরণ করতে পারে। নীচে কিছু গুরুত্বপূর্ণ Error Checking Techniques এবং তাদের ব্যবহার নিয়ে বিস্তারিত আলোচনা করা হলো।
প্রত্যেক সিস্টেম কল বা ফাংশন সাধারণত একটি Return Value প্রদান করে, যা ফাংশনের সাফল্য বা ব্যর্থতা নির্দেশ করে। এই Return Value চেক করা একটি সাধারণ এবং গুরুত্বপূর্ণ পদ্ধতি।
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
socket()
ফাংশন একটি sockfd
(Socket Descriptor) ফেরত দেয়। যদি এটি -1
হয়, তবে ত্রুটি ঘটেছে। perror()
ব্যবহার করে ত্রুটি বার্তা প্রিন্ট করা হয় এবং প্রোগ্রাম বন্ধ করা হয়।errno
ব্যবহারerrno
হলো একটি গ্লোবাল ভেরিয়েবল, যা সর্বশেষ সিস্টেম কল বা লাইব্রেরি ফাংশনের ত্রুটির কোড সংরক্ষণ করে। errno
এর সাহায্যে ত্রুটি শনাক্ত এবং নির্দিষ্ট ত্রুটির জন্য হ্যান্ডেল করা যায়।
#include <errno.h>
#include <stdio.h>
#include <string.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
errno
এর মান strerror()
ফাংশনের মাধ্যমে String Message-এ রূপান্তর করে ত্রুটি সম্পর্কে বিস্তারিত তথ্য পাওয়া যায়।errno
ব্যবহার করে ত্রুটির কোড অনুযায়ী নির্দিষ্ট হ্যান্ডলিং করা সম্ভব, যেমন:if (errno == EADDRINUSE) {
printf("Address is already in use. Try another port.\n");
}
perror()
ব্যবহারperror()
একটি সহজ পদ্ধতি, যা ত্রুটির বার্তা প্রিন্ট করে এবং সিস্টেমের ত্রুটি কোড অনুযায়ী তথ্য প্রদর্শন করে। এটি errno
এর মান ব্যবহার করে কাজ করে এবং ত্রুটির উৎস সম্পর্কে স্পষ্ট বার্তা দেয়।
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
perror()
ফাংশন একটি বিস্তারিত বার্তা প্রিন্ট করবে, যেমন: "Socket creation failed: Address already in use".perror()
একটি সংক্ষিপ্ত এবং কার্যকর উপায় ত্রুটির বার্তা প্রিন্ট করার জন্য।সাধারণ ত্রুটি হ্যান্ডলিংয়ের পাশাপাশি, উন্নত অ্যাপ্লিকেশনগুলোতে Custom Error Logging ব্যবহার করা হয়, যা ত্রুটি বার্তা লগ ফাইলে সংরক্ষণ করে। এটি ত্রুটির ইতিহাস সংরক্ষণ এবং অ্যাপ্লিকেশন ডিবাগিংয়ের জন্য গুরুত্বপূর্ণ।
#include <stdio.h>
#include <errno.h>
#include <string.h>
void log_error(const char *message) {
FILE *logfile = fopen("error_log.txt", "a");
if (logfile) {
fprintf(logfile, "%s: %s\n", message, strerror(errno));
fclose(logfile);
}
}
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
log_error("Socket creation failed");
exit(EXIT_FAILURE);
}
// অন্যান্য কোড
return 0;
}
log_error()
ফাংশন ব্যবহার করে ত্রুটি বার্তা এবং errno
এর ভিত্তিতে বিস্তারিত বার্তা লগ ফাইলে সংরক্ষণ করা হয়।Assertions কোডে এমন জায়গায় ব্যবহৃত হয়, যেখানে একটি নির্দিষ্ট শর্ত সত্য হওয়া আবশ্যক। Assertion ব্যর্থ হলে, এটি একটি ত্রুটি বার্তা প্রদর্শন করে এবং প্রোগ্রাম বন্ধ করে। এটি কোডে সম্ভাব্য বাগ বা সমস্যা শনাক্ত করতে ব্যবহৃত হয়।
#include <assert.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd >= 0);
sockfd
একটি বৈধ মান না ফেরত দেয় (অর্থাৎ, -1
), তবে Assertion ব্যর্থ হবে এবং প্রোগ্রাম বন্ধ হয়ে যাবে।ত্রুটি হ্যান্ডলিংয়ের সময় Timeout এবং Retry মেকানিজম প্রয়োগ করা যায়, বিশেষত নেটওয়ার্ক সংযোগ এবং ডেটা ট্রান্সমিশনের ক্ষেত্রে।
struct timeval timeout;
timeout.tv_sec = 5; // 5 সেকেন্ডের জন্য টাইমআউট
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
common.read_more